﻿#include "group.h"
#include "ui_group.h"
#include<QDebug>
#include<QJsonDocument>
#include<QProcess>
#include<QTime>
// #include "group_view.h"
#include "DataBase/mysql.h"
#include "itemselectpage.h"
#include "battlegroup.h"
#include "dialog/myhelper.h"
#include "constant.h"
Group::Group(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Group)
{
    ui->setupUi(this);
    initTableView();
    initServer();
    if(Constant::ShowFullScreen)
        this->showFullScreen();
}

Group::~Group()
{
    delete ui;
}
void Group::paintEvent(QPaintEvent *event)
{
    //通过这种方式可以将图片平铺到窗口上
    //使用样式表可以很方便设置界面，而且非常高效，还能让界面和逻辑分离
    //不过在本例中由于是顶层窗口，所以直接设置样式表也不会显示。
    //所以样式表比较适合子窗口来使用。
    QPainter painter(this);
    painter.drawPixmap(rect(),QPixmap(":/images/share/selectmodel_page_bg2.png"),QRect());
}
void Group::initServer()
{
    Server::instance();
    connect(this,SIGNAL(command_toClient(int,QJsonObject)),Server::instance(),SLOT(writeMsgToClient(int,QJsonObject)));
    connect(Server::getInstance(),SIGNAL(updateMsg(QString, QString)),this,SLOT(receivedMsg(QString, QString)));

    connect(Server::getInstance(),SIGNAL(updateMsg(QJsonObject&)),this,SLOT(receivedMsg(QJsonObject&)));
    connect(Server::getInstance(),SIGNAL(updateClient(QString)),this,SLOT(addNewClient(QString)));
    connect(Server::getInstance(),SIGNAL(removeClient(QString)),this,SLOT(removeClient(QString)));


}
void Group::initTableView()
{
    //自定义表头操作
    m_pTableHeader = new TableViewHeader(Qt::Horizontal, this);//表头
    m_pTableHeader->setStretchLastSection(true);//表头最后一列填充
    ui->tableView->setHorizontalHeader(m_pTableHeader);//设置表头

    //创建model（目前使用的是标准数据模型，可以自定义数据模型），绑定model
    m_pTableModel = new QStandardItemModel(this);
    ui->tableView->setModel(m_pTableModel);//设置model
    ui->tableView->verticalHeader()->hide();


    //创建表头信息
    QStringList headerList;
    headerList << " " << tr("No.")   << tr("IP")<< tr("用户名") << tr("姓名") << tr("性别") << tr("年龄")<<tr("手环");
    m_pTableModel->setHorizontalHeaderLabels(headerList);


    //单击
    // connect(ui->tableView, &QTableView::clicked,
    //         this, &Group::on_tableViewClick);
    // //双击
    // connect(ui->tableView, &QTableView::doubleClicked,
    //         this, &Group::on_tableViewDbClick);

    //标题头排序
    // connect(ui->tableView->horizontalHeader(), &QHeaderView::sectionClicked,
    //         this, &Group::on_tableViewSort);
    // //全选
    // connect(m_pTableHeader, &TableViewHeader::stateChanged,
    //         this, &Group::on_tableViewSelectAllCheckBoxClick);

    //设置列宽
    setColumnWidth();

}
/*************************
 * QTableView-单击事件
 * ***********************/
void Group::on_tableViewClick(QModelIndex nIndex)
{


    int nRow = nIndex.row();
    int nCol = nIndex.column();

    Qt::CheckState oldState = m_pTableModel->item(nRow, COLUMN_CHECKBOX)->checkState();
    Qt::CheckState newState;

    if(oldState == Qt::Unchecked)
    {
        newState = Qt::Checked;
        m_nCheckedCount++;
    }
    else
    {
        newState = Qt::Unchecked;
        m_nCheckedCount--;
    }
    m_pTableModel->item(nRow, COLUMN_CHECKBOX)->setCheckState(newState);

    if(newState == Qt::Unchecked || m_nCheckedCount == m_pTableModel->rowCount())
    {
        m_pTableHeader->onStateChanged(newState);//改变标题栏的全选状态
    }
}

/*************************
 * QTableView-双击事件
 * ***********************/
void Group::on_tableViewDbClick(QModelIndex nIndex)
{


    int row = nIndex.row();

    qDebug() << "Db Click row:" << row;
}
/*************************
 * QTableView-排序
 * ***********************/
void Group::on_tableViewSort(int nColumn)
{

    //点击表头实现排序
    ui->tableView->horizontalHeader()->setSortIndicatorShown(true);
    ui->tableView->sortByColumn(nColumn,Qt::AscendingOrder);
}
/*************************
 * QTableView-响应表头全选操作
 * ***********************/
void Group::on_tableViewSelectAllCheckBoxClick(Qt::CheckState state)
{
    int nRowCount = m_pTableModel->rowCount();//当前行数

    for(int i = 0; i < nRowCount; i++)
    {
        m_pTableModel->item(i, COLUMN_CHECKBOX)->setCheckState(state);
    }
}

/*************************
 * QTableView-设置列宽
 * ***********************/
void Group::setColumnWidth()
{
    ui->tableView->setColumnWidth(COLUMN_CHECKBOX,100);
    ui->tableView->setColumnWidth(COLUMN_IP,400);
    ui->tableView->setColumnWidth(COLUMN_NO, 100);
    ui->tableView->setColumnWidth(COLUMN_ID, 400);

    ui->tableView->setColumnWidth(COLUMN_NAME, 400);
    ui->tableView->setColumnWidth(COLUMN_SEX, 250);
    ui->tableView->setColumnWidth(COLUMN_AGE, 250);
    ui->tableView->setColumnWidth(COLUMN_DEVICE,200);


}
void Group::resizeEvent(QResizeEvent *)
{
    setColumnWidth();
}


void Group::receivedMsg(QString address, QString msg)
{
    qDebug()<<this->thread()<<"receivedMsg:"<<"address:"<<address<<",msg:"<<msg;
//    ui->listWidget ->addItem(address + ": " + msg);
}

void Group::receivedMsg(QJsonObject & json)
{
    USER_TABLE_DATA userdata;
    qDebug()<<this->thread()<<QString(QJsonDocument(json).toJson());
    Qt::HANDLE threadId = QThread::currentThreadId();
    QString threadIdStr = QString::number(reinterpret_cast<quintptr>(threadId));

    QString ip_s;
    if(json.contains("IP")){
        userdata.IP=json["IP"].toString();
        ip_s=json["IP"].toString();
    }
    if(json.contains("socketDescriptor"))
        userdata.socketDescriptor=json["socketDescriptor"].toInt();
    if(json.contains("fcode"))
    {
        int fcode=json["fcode"].toInt();
        if(fcode==102)
        {
            int num=json["num"].toInt();
            qDebug()<<"num================"<<num;
            QString LoginState="0";
            if(json.contains("userInfoBean"))
            {
                QJsonObject userInfoBeanObj=json["userInfoBean"].toObject();
                if(userInfoBeanObj.contains("UserID"))
                {
                    userdata.nNo=userInfoBeanObj["UserID"].toString();
                    QString file=Constant::DataBasePath;
                    MySql *mySql = new MySql(file,threadIdStr);

                    UserInfoBean dataUserInfoBean;
                    QJsonObject RegistInfo;
                    QJsonObject UserInfoBean;//创建用户信息对象，处理客户端未注册的情况，直接从服务端获取用户信息，将用户信息的姓名，性别和年龄传递到客户端

                    if(mySql->MySelect(userdata.nNo,dataUserInfoBean))
                    {
                        userdata.sName=dataUserInfoBean.UserName;
                        userdata.nSex=dataUserInfoBean.UserSex;
                        userdata.nAge=dataUserInfoBean.UserAge.toInt();
                        LoginState=dataUserInfoBean.IsLogin;
                    }
                    delete mySql;
                }
            }
            if(json.contains("icode"))
            {
                int icode=json["icode"].toInt();
                if(icode==1)
                    userdata.DeviceState="链接";
                else
                    userdata.DeviceState="断开";
            }

            m_userTableHash.insert(userdata.IP,userdata);

            RefreshTable();

        }else if(fcode==122){
            USER_TABLE_DATA ud=m_userTableHash.value(userdata.IP);
            userdata.nNo=ud.nNo;
            userdata.sName=ud.sName;
            userdata.nSex=ud.nSex;
            userdata.nAge=ud.nAge;
            if(json.contains("icode"))
            {
                int icode=json["icode"].toInt();
                if(icode==1)
                    userdata.DeviceState="链接";
                else
                    userdata.DeviceState="断开";
            }
            m_userTableHash.insert(userdata.IP,userdata);
            RefreshTable();
        }else if(fcode == 104)
        {
            //退出登录也要把列表中的信息去除
            m_userTableHash.remove(userdata.IP);
            RefreshTable();
        }

    }
    if(json.contains("slotDisconnected"))
    {
        //断开连接去除用户信息显示
        m_userTableHash.remove(userdata.IP);
        RefreshTable();
    }
}

void Group::addNewClient(QString address)
{
    qDebug()<<"Connect OK to: "<<address;
}

void Group::removeClient(QString address)
{
    m_userTableHash.remove(address);
    qDebug()<<"Disconnect to: "<<address;
    RefreshTable();
//    ui->listWidget->addItem(QString("Disconnect to: ") + address);
//    for(int i = 0; i< ui->comboBox->count();i++)
//    {
//        if(ui->comboBox->itemText(i) == address)
//        {
//            ui->comboBox->removeItem(i);
//            break;
//        }
//    }
}
void Group::RefreshTable()
{
    if(m_pTableModel->rowCount() > 0)
    {
        m_pTableModel->removeRows(0, m_pTableModel->rowCount());
    }

    QHashUserTableIterator i = m_userTableHash.begin();
    int row = 0;
    for(; i != m_userTableHash.end(); ++i)
    {
        USER_TABLE_DATA data = i.value();

        //可以通过insertRow和setData增加数据
        m_pTableModel->insertRow(row, QModelIndex());
        m_pTableModel->setData(m_pTableModel->index(row, COLUMN_CHECKBOX), "");
        m_pTableModel->setData(m_pTableModel->index(row, COLUMN_NO), row+1);
        m_pTableModel->setData(m_pTableModel->index(row, COLUMN_IP), data.IP);
        m_pTableModel->setData(m_pTableModel->index(row, COLUMN_NAME), data.sName);
        m_pTableModel->setData(m_pTableModel->index(row, COLUMN_ID), data.nNo);
        m_pTableModel->setData(m_pTableModel->index(row, COLUMN_SEX), data.nSex);
        m_pTableModel->setData(m_pTableModel->index(row, COLUMN_AGE), data.nAge);
        m_pTableModel->setData(m_pTableModel->index(row,COLUMN_DEVICE),data.DeviceState);


        //也可以通过setItem增加数据
        //m_pTableModel->setItem(row, COLUMN_CHECKBOX, new QStandardItem(""));

        // 设置全部列居中显示
        for(int j = COLUMN_CHECKBOX; j <= COLUMN_DEVICE; j++)
        {
            m_pTableModel->item(row, j)->setTextAlignment(Qt::AlignCenter);
        }
        row++;
    }
}

void Group::findDataByColumnName(QStandardItemModel* model, const QString& columnName, int rowIndex) {
    // 遍历所有列，找到列名对应的索引
    int columnIndex = -1; // 初始化列索引为-1，如果未找到则保持这个值
    for (int i = 0; i < model->columnCount(); ++i) {
        if (model->headerData(i, Qt::Horizontal, Qt::DisplayRole).toString() == columnName) {
            columnIndex = i;
            break;
        }
    }

    // 检查是否找到了列索引
    if (columnIndex != -1) {
        // 获取指定行和列的数据
        QModelIndex index = model->index(rowIndex, columnIndex);
        QString data = index.data().toString(); // 获取数据并转换为QString
        qDebug() << "Data found:" << data; // 输出找到的数据
    } else {
        qDebug() << "Column name not found."; // 如果没有找到列名，输出提示信息
    }
}
#include <QStandardItemModel>
#include <QDebug>

QList<QStandardItem*> Group::findDataInThirdColumn(QStandardItemModel* model, const QString& searchValue) {
    // 获取模型中的行数
    int rowCount = model->rowCount();
    QList<QStandardItem*> itemsInRow;
    // 遍历每一行
    for (int row = 0; row < rowCount; ++row) {
        // 获取第三列的项（索引为2）
        QStandardItem* item = model->item(row, 2);
        if (item && item->text() == searchValue) {
            // 找到匹配的数据，获取该行的所有数据
            itemsInRow = model->takeRow(row); // 或者使用 model->item(row, col) 获取特定列的数据
//            for (QStandardItem* itemInRow : itemsInRow) {
//                qDebug() << "Column Index:" << itemInRow->column() << "Data:" << itemInRow->text();
//            }
            // 如果需要恢复行，可以使用 model->insertRow(row, itemsInRow);
            // 如果你只想获取特定列的数据，可以直接使用 model->item(row, colIndex)->text();
            break; // 找到后可以选择停止查找
        }
    }
    return itemsInRow;
}
void Group::on_pushButton_exit_clicked()
{
    close();
}


void Group::getType(int type)
{
    this->type=type;
}
void Group::on_pb_enter_clicked()
{

    QHashUserTableIterator i = m_userTableHash.begin();
    int row = 0;
    int NoConnectDeviceNum=0;
    for(; i != m_userTableHash.end(); ++i)
    {
        USER_TABLE_DATA data = i.value();

        //可以通过insertRow和setData增加数据
        if(data.DeviceState=="断开")
            NoConnectDeviceNum++;
        row++;
    }
    if(row>0)
    {
        if(NoConnectDeviceNum>0)
        {
            myHelper::ShowMessageBoxInfo("有设备未连接，请等待设备连接再进入训练！");
        }else
        {
            if(type==0)
            {
                //如果是团体直接进入功能选择页面
                ItemSelectPage *itemPage=new ItemSelectPage;
                connect(this,SIGNAL(SendUserTableInfo(QHashUserTable)),itemPage,SLOT(getUserTableInfo(QHashUserTable)));
                emit SendUserTableInfo(m_userTableHash);
                itemPage->show();
            }else
            {
                //如果是对抗模式，进入分组页面
                BattleGroup *battleGroup=new BattleGroup;
                connect(this,SIGNAL(SendUserTableInfo(QHashUserTable)),battleGroup,SLOT(getUserTableInfo(QHashUserTable)));
                emit SendUserTableInfo(m_userTableHash);
                battleGroup->show();
            }
        }
        this->close();
    }else
    {
        myHelper::ShowMessageBoxInfo("当前没有用户登录，无法进入进行训练，请等待用户登录！");
    }
}
